package com.lagou.handler;

import com.lagou.Util.SpringContextUtil;
import com.lagou.common.RpcRequest;
import com.lagou.service.UserServiceImpl;
import io.netty.channel.ChannelHandler;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;
import io.netty.util.concurrent.EventExecutorGroup;

import java.lang.reflect.Method;

/**
 * 自定义的业务处理器
 */
public class UserServiceHandler extends ChannelInboundHandlerAdapter {

    /**
     * 当客户端读取数据时，该方法被调用
     * @param ctx
     * @param msg
     * @throws Exception
     */
    @Override
    public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
//        //客户端发送请求时的一个参数 约定    UserService#sayHello#are you ok
//        //   判断当前的请求是否符合规则
//        if (msg.toString().startsWith("UserService")){
//            //符合规则 调用实现类 到一个result
//            UserServiceImpl userService = new UserServiceImpl();
//            String result = userService.sayHello(msg.toString().substring(msg.toString().lastIndexOf("#") + 1));
//            //将结果写到客户端
//            ctx.writeAndFlush(result);
//        }


        /**
         *   1、从RpcRequest对象中获取属性 （调用类名，方法，参数等）
         */
        RpcRequest rpcRequest =(RpcRequest)msg;
        String className = rpcRequest.getClassName();
        String methodName = rpcRequest.getMethodName();
        Object[] parameters = rpcRequest.getParameters();
        Class<?>[] parameterTypes = rpcRequest.getParameterTypes();

        Class<?> aClass = Class.forName(className);
        //从spring容器获取对象
        UserServiceImpl o = (UserServiceImpl) SpringContextUtil.getBean(aClass);
        Method method = aClass.getMethod(methodName, parameterTypes);
        //反射调用
        String result = (String) method.invoke(o, parameters);

        ctx.writeAndFlush(result);
    }
}
